package engine;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import compute.Compute;
import compute.Task;

public class ComputeEngine implements Compute {

	public ComputeEngine() {
		super();
	}

	public <T> T executeTask(Task<T> t) {
		System.out.println("Task executed.");
		return t.execute();
	}

	public static void main(String[] args) {
		if (System.getSecurityManager() == null) {
			System.setSecurityManager(new SecurityManager());
		}

		try {
			//nesse exemplo iremos instaciar o RmiRegistry, pois não há necessidade de roda-lo como serviço
			//necessario definir a porta de escuta do rmi registry para compatibilidade com o firewall, do contrario porta 1099 como padrão
			Registry registry = LocateRegistry.createRegistry(Integer.parseInt(args[0]));
			String name = "Compute";
			Compute engine = new ComputeEngine();
			//necessario definir a porta do Stub, do contrario sera utilizado porta aleatoria (compatiblidade firewall)
			Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, Integer.parseInt(args[1]));
			//linha utilizado no caso de tulizacao do servico rmiregistry				
			//Registry registry = LocateRegistry.getRegistry();
			registry.rebind(name, stub);
			System.out.println("ComputeEngine bound");
		} catch (Exception e) {
			System.err.println("ComputeEngine exception:");
			e.printStackTrace();
		}
	}
}
